with Ada.Text_IO; use Ada.Text_IO;
with My_String.IO;

package body Matiere.IO is

   ----------------------------------------ETAT--------------------------------------------------------
   function Saisir_Etat return Type_Etat is
      Selon : Type_Etat;
   begin
      loop
         declare
         begin
            Selon := Type_Etat'Value(Get_Line);
            exit;
         exception
            when others =>
               Put_Line("Erreur, reesayez");
         end;
      end loop;
      return Selon;
   end Saisir_Etat;


   ----------------------------------------NOTE---------------------------------------------------------

   function Saisir_Note_Valeur return Type_Note_Valeur is
      ERREUR_SAISIE_NOTE : EXCEPTION;
      subtype Avant_Virgule is Integer Range 0..20;
      Avant,Apres : String(1..2) := "00";
      Virgule : Character;

      NB : Type_Note_Valeur;

   begin
      loop
         declare
         begin

            Get(Avant);
            Get(Virgule);
            if Virgule = ',' or Virgule = '.' then
               Get(Apres);
            else
               raise ERREUR_SAISIE_NOTE;
            end if;
            Skip_Line;

            if  Avant = "20" and Integer'Value(Apres) /= 0 then
               raise ERREUR_SAISIE_NOTE;
            end if;
            NB := (Avant_Virgule => Avant_Virgule'Value(Avant), Apres_Virgule => Integer'Value(Apres));

            exit;

         EXCEPTION
            when others =>
               Put_Line("Erreur, Reesayez :");
         end;
      end loop;

      return NB;

   end Saisir_Note_Valeur;

   function Afficher_Note_Valeur(Note : in Type_Note_Valeur) return String is
   begin
      return Integer'Image(Note.Avant_Virgule) & "," & Integer'Image(Note.Apres_Virgule);
   end Afficher_Note_Valeur;

   function Afficher_Note(Note : in Type_Note) return String is
   begin
      return Afficher_Note_Valeur(Note.Valeur);
   end Afficher_Note;

   ----------------------------------------COEFFICIENT---------------------------------------------------
   function Saisir_Coefficient return Type_Coefficient is
      Coef : Type_Coefficient;
   begin
      loop
         declare
         begin
            Coef := Type_Coefficient'Value(Get_Line);
            exit;
         exception
            when others =>
               Put_Line("Erreur, Reesayez :");
         end;
      end loop;
      return Coef;
   end;

   -----------------------------------MATIERE------------------------------------------------------
   function Saisir_Matiere return Type_Matiere is
      Matiere : Type_Matiere;
   begin
      Put("Intitule de la matiere :");
      Matiere.Intitule := My_String.IO.Get;
      Matiere.Note := (Selon => Libre);

      return Matiere;
   end Saisir_Matiere;

   procedure Afficher_Matiere(Matiere : in Type_Matiere) is
   begin
      New_Line;
      Put_Line("-----------------------------------------------");
      Put_Line("Intitule :" & My_String.IO.Afficher_String(Matiere.Intitule));
      Put_Line("Coefficient :" & Type_Coefficient'Image(Matiere.Coefficient));
      if Matiere.Note.Selon = Libre then
         Put_Line("Note : Libre");
      else
         Put_Line("Note :" & Afficher_Note(Matiere.Note));
      end if;
      Put_Line("-----------------------------------------------");
      New_Line;
   end Afficher_Matiere;

   procedure Afficher_Matieres(Matieres : in Type_Matieres) is
   begin
      For I in 1..Matieres.Nombre loop
         Afficher_Matiere(Matieres.Tab(I));
      end loop;
   end Afficher_Matieres;

end Matiere.IO;